<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_OfferComponent
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy Application_Model_OfferComponen.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 * 
 */
class Application_Model_OfferComponentMapper
{


    protected $_dbTable; /*!<  Obiekt klasy tabeli */
    
    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_OfferComponentMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }

    /**
     * @brief Metoda zwracająca obiekt powiązanej klasy tabel.
     * 
     * @return Application_Model_DbTable_OfferHasCommodity 
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_OfferHasCommodity'); 
            
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca informacje do bazy danych  z obiektu reprezentującego 
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych. 
     * Aktualizacja następuje w przypadku, gdy zostanie wybrana taka opcja.
     * 
     * @param Application_Model_OfferComponent $component
     * @param bool $update 
     */
    public function save(Application_Model_OfferComponent $component,$update = FALSE) {

        $data = array(

            'Offer_id'      =>$component->getOffer_id(),
            'Commodity_id'   =>$component->getCommodity_id(),
            'shareFactor'   =>$component->getShareFactor(),
            'quantity'      =>$component->getQuantity(),
        );
        
        if (!$update) {
            $this->getDbTable()->insert($data);
        } else {
            unset($data['Offer_id']);
            unset($data['Commodity_id']);
            $this->getDbTable()->update($data, array('Offer_id = ?' => $component->getOffer_id(),'Commodity_id = ?' => $component->getCommodity_id())); 
        }
    }


    /**
     * @brief Metoda wyszukująca zbiór komponentów na podstawie danych wejściowych.
     *
     * Metoda wyszukuje zbiór komponentów i zwraca tablicę obiektów Application_Model_OfferComponent.
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę
     * 
     * @param string $query
     * @return array Application_Model_OfferComponent   
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
	
    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_OfferComponent  
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $component = new Application_Model_OfferComponent();

            $component->setCommodity_id($row->Commodity_id);
            $component->setOffer_id($row->Offer_id);
            $component->setShareFactor($row->shareFactor);
            $component->setQuantity($row->quantity);

            $entries[] = $component;
        }
        return $entries;
    }
    
    /**
     * @brief Metoda wyszukująca zbiór komponentów związanych z daną ofertą.
     * 
     * @param int $id
     * @return array Application_Model_OfferComponent  
     */
    public function fetchComponentsByOffer($id){
        return $this->fetchAll('Offer_id = '.$id);
    }
    
    /**
     * @brief Metoda wyszukująca zbiór komponentów związanych z danym towarem.
     * 
     * @param int $id
     * @return array Application_Model_OfferComponent  
     */
    public function fetchComponentsByCommodity($id){
        return $this->fetchAll('Commodity_id = '.$id);
    }
	
    public function delete($offerId, $commodityId){
        $query = 'Commodity_id = '.$commodityId.' and Offer_id = '.$offerId.' ';
        $this->getDbTable()->delete($query);
    }

}

